'use strict';

const BaseController = require("../base");
const SysRoleDto = require("../../dto/sys-role.dto");
class SysRoleController extends BaseController {
    /**
    * @description 分页查询列表
    * @param {SysRoleDto.pageDto} 查询参数
    */
    async page() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysRoleDto.pageDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //前往service层进行处理
            const res = await this.service.system.sysRole.page(verifytRes.params);
            if (!res.success) throw res.msg;

            //使用列表请求的模块
            await this.listSuccess(res.data.rows, res.data.count);
        } catch (err) {
            await this.error(err);
        }
    }

    /**
    * @description 创建角色
    * @param {SysRoleDto.createDto} 参数
    */
    async create() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysRoleDto.createDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //获取当前创建用户的用户信息
            const user = await this.getLoginUser();
            console.log('获取当前登录用户', user)

            //获取到params参数,然后添加创建id和创建时间
            let params = verifytRes.params;
            params.createById = user.id;
            params.createTime = new Date();

            //前往业务层service进行创建新用户
            const res = await this.service.system.sysRole.create(params);
            if (!res.success) throw res.msg;


            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }


    /**
     * @description 编辑
     * @param {SysRoleDto.editDto} 参数
     */
    async edit() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysRoleDto.editDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //获取到当前用户的信息
            const user = await this.getLoginUser();

            //获取到被更新用户的id和参数,然后参数添加当前登录用户的id 当前登录用户的的名字 更新时间
            const id = verifytRes.params.id;
            delete verifytRes.params.id;
            let params = verifytRes.params;
            params.updateById = user.id;
            params.updateByName = user.username;
            params.updateTime = new Date();

            //前往业务层进行处理
            const res = await this.service.system.sysRole.edit(id, params);
            if (!res.success) throw res.msg;
            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }

    /**
    * @description 删除
    * @param {SysRoleDto.delDto} 参数
    */
    async del() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysRoleDto.delDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //问:前往业务层进行删除角色,这里进行真正的删除?为什么是进行真的删除?这个点很奇怪,是不是故意留bug?
            const res = await this.service.system.sysRole.del(verifytRes.params.id);
            if (!res.success) throw res.msg;

            await this.success();
        } catch (err) {
            await this.error(err);
        }
    }


    /**
     * @description 更新角色菜单
     * @param {SysRoleDto.updatePermDto} 查询参数
     */
    async updatePerm() {
        try {
            //通过dto.js约束参数,然后返回有约束的参数
            const verifytRes = this.verifytParams(SysRoleDto.updatePermDto);
            if (!verifytRes.success) throw verifytRes.msg;

            //创建一个用户角色数组
            let params = [];
            const roleId = verifytRes.params.roleId;
            verifytRes.params.menuIds.map(menuId => {
                params.push({ roleId, menuId });
            })
            console.log('拼接完成后为')
            console.log(params)

            //前往业务层进行更新用户角色表
            const res = await this.service.system.sysRole.updatePerm(roleId, params)
            if (!res.success) throw res.msg;
            await this.success();
        } catch (err) {
            console.log(err)
            await this.error(err);
        }
    }

    /**
     * @description 获取所有未删除的角色
     */
    async select() {
        try {
            const res = await this.service.system.sysRole.select();
            if (!res.success) throw res.msg;

            await this.success(res.data)
        } catch (err) {
            await this.error(err);
        }
    }

}

module.exports = SysRoleController;
